/*
ID: icerupt1
PROG: nocows
LANG: C++11
*/

/*
 * f[num][dep] 表示当前节点一共num个节点，最大深度为dep可以有的方案数。
 * g[num][dep] 表示当前节点一共num个节点，最大深度小于等于dep可以有的方案数。
 * g数组的存在是为了优化f的状态转移，可以优化掉一维的转移。
*/
#include <fstream>
#include <iostream>
#include <cmath>

std::ifstream fin {"nocows.in" };
std::ofstream fout{"nocows.out"};

int const maxn = 202;
int const maxk = 102;
int const mo = 9901;
long long f[maxn][maxk];
long long g[maxn][maxk];
int n, k;


void dfs_g(int num, int dep)
{
	if (g[num][dep] != -1) return;
	long long tot = 0;
	for (int i = 1; i <= num-1-i; i++) {
		dfs_g(i, dep-1);  dfs_g(num-1-i, dep-1);
		int t = 2;
		if (i == num-1-i) t--;
		tot += t * g[i][dep-1] * g[num-1-i][dep-1];
		tot %= mo;
	}
	g[num][dep] = tot;
}

void dfs(int num, int dep)
{
	if (f[num][dep] != -1) return;
	long long tot = 0;
	for (int i = 1; i <= num-1-i; i++) {
		dfs(i, dep-1);  dfs(num-1-i, dep-1);
		int t = 2;
		if (i == num-1-i) t--;
		dfs_g(i, dep-2);  dfs_g(num-1-i, dep-2);
		tot += t * f[i][dep-1] * g[num-1-i][dep-2];
		tot += t * g[i][dep-2] * f[num-1-i][dep-1];
		tot = (tot + t * f[i][dep-1] * f[num-1-i][dep-1]) % mo;
	}
	f[num][dep] = tot;
}

int main()
{
	fin >> n >> k;
	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= k; j++) {
			f[i][j] = g[i][j] = -1;
			if (j * std::log(2) <= std::log(i)) f[i][j] = g[i][j] = 0;
		}
	f[0][0] = f[1][1] = 1;
	g[0][0] = 1;
	for (int i = 1; i <= k; i++) g[1][i] = 1;

	dfs(n, k);
	std::cout << f[n][k] << '\n';
	fout << f[n][k] << '\n';
}
